package JAVAcollectionsanddatastructures.List;

import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ArrayList {
    public static void main1(String[] args) {
        List<String> list = new java.util.ArrayList<>(20);//初始值就是给定的大小，放满了还是以1.5倍扩容

        //思考初始的大小是几？调用不带参数的构造方法时初始值是0，但是第一次存放元素时初始容量被设置为10。如果10个放满了，以1.5倍方式进行扩容
        //底层虽然是数组，但是这个数组没有大小，那么既然数组为0，为什么又能存放数组呢？
        java.util.ArrayList<String> list1 = new java.util.ArrayList<>();
        list1.add("hello");
        list1.add("bit");
        list1.add("haha");


        System.out.println(list1);
        System.out.println("======================");

        //使用for循环打印
        for (int i = 0; i < list1.size(); i++) {
            System.out.print(list1.get(i) + " ");
        }
        System.out.println();

        //使用foreach打印
        for (String s : list1) {
            System.out.print(s + " ");
        }
        System.out.println();

        //使用迭代器打印
        Iterator<String> it = list1.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
        System.out.println();

        //迭代器List打印
        ListIterator<String> it1 = list1.listIterator();
        while (it1.hasNext()) {
            System.out.print(it1.next() + " ");
        }
        System.out.println();

        //================================================================================
        //迭代器remove方法:首先需要使用next方法迭代出集合中的元素，然后才能调用remove方法，否则就会抛出异常
        Iterator<String> it2 = list1.iterator();
        while (it2.hasNext()) {
            String ret = it2.next();
            if (ret.equals("hello")) {
                it2.remove();
            } else {
                System.out.print(ret + " ");
            }
        }
        System.out.println();

        //使用另外一个对list2进行初始化
        java.util.ArrayList<String> list2 = new java.util.ArrayList<>(list1);//将list1整体传给list3，要注意参数类型保持一致
    }

    public static void main2(String[] args) {
        java.util.ArrayList<String> list1 = new java.util.ArrayList<>();
        list1.add("hello");
        list1.add("bit");
        list1.add("haha");

        //迭代器List打印
        ListIterator<String> it2 = list1.listIterator();
        while (it2.hasNext()) {
            String ret = it2.next();//会抛出异常
            if (ret.equals("hello")) {
                it2.add("tanchen");//添加的元素是跟着迭代器走的
            } else {
                System.out.print(ret + " ");
            }
        }
        System.out.println();
        System.out.println(list1);
    }


    public static void main3(String[] args) {
        java.util.ArrayList<String> list1 = new java.util.ArrayList<>();
        list1.add("a");
        list1.add("b");//add方法默认放到最后一个位置
        list1.add("c");
        System.out.println(list1);

        list1.add(0, "tanchen");
        System.out.println(list1);

        java.util.ArrayList<String> list2 = new java.util.ArrayList<>();
        list2.add("我是测试list");

        //把整个list作为一个元素添加进来
        list1.addAll(list2);
        System.out.println(list1);

        //通过下标remove
        String ret = list1.remove(0);
        System.out.println(list1);

        //通过get获取
        String ret1 = list1.get(2);
        System.out.println(ret1);

        //通过下标更新元素
        String ret2 = list1.set(0, "gaobo");
        System.out.println(list1);

        //clear
//        list1.clear();
//        System.out.println(list1);
//

        //contains
        System.out.println(list1.contains("c"));

        //返回第一个指定元素的下标
        System.out.println(list1.indexOf("b"));

        //返回最后一个指定元素的下标
        System.out.println(list1.lastIndexOf("c"));

        //sublist截取
        List<String> sub = list1.subList(1, 3);//左闭右开
        System.out.println(sub);
        System.out.println(list1);
        System.out.println("===============");
        sub.set(0, "p");
        System.out.println(sub);
        System.out.println(list1);//此时list1中的b也变成了p，说明并不是正在截取出来了，只是把截取部分的地址传给了sub
    }

    /*class MyArrayList<E> {
        private Object[] elementData;
        private int usedSize;

        private final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

        public MyArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }

        public MyArrayList(int capacity) {
            //对参数进行判断
            if (capacity > 0) {
                this.elementData = new Object[capacity];
            } else if (capacity == 0) {
                this.elementData = new Object[0];
            } else {
                throw new IllegalArgumentException("初始化容量不能为负数");
            }
        }
    }*/


    //删除第一个字符串当中出现的第二个字符串中的字符
    public static void main(String[] args) {
        String str1 = "welcome to bit";
        String str2 = "come";
        java.util.ArrayList<Character> list = new java.util.ArrayList<>();
        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if (!str2.contains(ch+" ")){
                list.add(ch);
            }
        }
        for (char ch : list) {
            System.out.print(ch);
        }

    }
}



